package controll;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.LinkedHashMap;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedProperty;
//import javax.faces.application.FacesMessage;
import javax.faces.bean.ViewScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
//import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

import org.primefaces.component.datatable.DataTable;
import org.primefaces.event.CellEditEvent;

import modell.Cronograma;
import modell.Obra;
import modell.Periodo;
import modell.Servico;

@ManagedBean(name = "cronogramaBean")
@ViewScoped
public class CronogramaBean {

	private Obra obraSelecionada;
	private Servico servicoSelecionado = new Servico();
	private Cronograma cronogramaSelecionado = new Cronograma();
	private List<SelectItem> obrasSelect;
	private List<Cronograma> lista = null;
	private List<Servico> listaServico = null;
	private List<Periodo> listaPeriodo = null;
	private List<Cronograma> listaCronograma;
	List<Cronograma> listaCro = null;
	private Integer contador;
	private String status;
	private Double total = 0.0;
	private Integer idServico = 0;
	public FacesMessage msg = null;

	@PostConstruct
	public void init() {
		atualizaListaCronograma();
	}

	@ManagedProperty(value = "#{navegacaoBean}")
	private NavegacaoBean navegacaoBean;

	public void setNavegacaoBean(NavegacaoBean navegacaoBean) {
		this.navegacaoBean = navegacaoBean;
	}

	public void atualizaListaCronograma() {
		contador = 0;
		getLista();
		getListaPeriodo();
		getListaServico();
		listaCronograma = new ArrayList<Cronograma>();
		for (int i = 0; i < listaServico.size(); i++) {
			listaCronograma.add(new Cronograma(listaServico.get(i),
					getValPercentual()));
		}
	}

	public String salvarServico() {

		try {

			servicoSelecionado.setDataCadastro(new Date());

			ServicoRN servicoRN = new ServicoRN();

			if (this.servicoSelecionado.getId() != null
					&& this.servicoSelecionado.getId() != 0) {
				servicoRN.alterar(servicoSelecionado);
			} else {
				servicoSelecionado.setObra(obraSelecionada);
				servicoRN.salvar(servicoSelecionado);
				salvarCronograma();
				msg = new FacesMessage("Salvo com sucesso!");
			}

			this.lista = null;
			this.listaCronograma = null;
			atualizaListaCronograma();
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}

		return navegacaoBean.redirectToCronograma();
	}

	public String salvarCronograma() {

		try {
			PeriodoRN periodoRN = new PeriodoRN();
			List<Periodo> lista = periodoRN.listar();
			// List<Periodo> lista = periodoRN.listarPorObras(obraSelecionada
			// .getId());

			CronogramaRN cronogramaRN = new CronogramaRN();
			// FacesMessage faces = null;

			if (this.cronogramaSelecionado.getId() != null
					&& this.cronogramaSelecionado.getId() != 0) {
				for (Periodo periodo : lista) {
					cronogramaSelecionado = new Cronograma(servicoSelecionado,
							periodo, obraSelecionada, 0.0, new Date());
					cronogramaRN.alterar(cronogramaSelecionado);
				}

			} else {
				for (Periodo periodo : lista) {
					cronogramaSelecionado = new Cronograma(servicoSelecionado,
							periodo, obraSelecionada, 0.0, new Date());
					cronogramaRN.salvar(cronogramaSelecionado);
				}

			}
			// FacesContext contexto = FacesContext.getCurrentInstance();
			// contexto.addMessage(null, faces);
			this.listaCronograma = null;
			this.lista = null;
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}

		return null;
	}
	public String salvarCro() {

		try {
			
			CronogramaRN cronogramaRN = new CronogramaRN();
			// FacesMessage faces = null;

			if (this.cronogramaSelecionado.getId() != null){
						cronogramaRN.alterar(cronogramaSelecionado);
				
			} else {
					cronogramaRN.salvar(cronogramaSelecionado);
			}
			
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}

		return null;
	}

	public String excluir(Integer idSer) {
		servicoSelecionado.setId(idSer);
		CronogramaRN cronogramaRN = new CronogramaRN();
		cronogramaRN.excluirPorServico(idSer, obraSelecionada.getId());
		this.lista = null;
		ServicoRN servicoRN = new ServicoRN();
		servicoRN.excluirPorId(idSer);
		this.listaCronograma = null;

		return navegacaoBean.redirectToCronograma();
	}

	public List<Cronograma> buscarCronograma(Integer servico) {
		
		CronogramaRN cronogramaRN = new CronogramaRN();
		listaCro = cronogramaRN.buscarCronograma(servico, obraSelecionada.getId());
		cronogramaSelecionado = listaCro.get(0);
		return listaCro;
	}

	public void buscarServico(Integer idSer) {
		ServicoRN servicoRN = new ServicoRN();
		servicoSelecionado = setServicoSelecionado(servicoRN
				.buscarServico(idSer));
	}

	public int getMesesCount() {
		return lista.size();
	}

	public Double getPesoCount() {
		Double total = 0.0;
		for (Servico servico : getListaServico()) {
			total = servico.getPeso() + total;
		}
		return total;
	}

	public Double getExecutadoCount() {
		Double total = 0.0;
		for (Servico servico : getListaServico()) {
			total = servico.getPercExecutado() + total;
		}
		return total;
	}

	public Double getAcumuladoCount(int Mes, int Servico) {

		CronogramaRN cronogramaRN = new CronogramaRN();
		Cronograma cronograma = cronogramaRN.buscarPorMes(Mes, Servico);

		if (getIdServico() != Servico) {
			total = cronograma.getServico().getPercExecutado();
			total = cronograma.getPercMes() + total;

		} else
			total = cronograma.getPercMes() + total;

		setIdServico(cronograma.getServico().getId());
		return total;
	}
	public Double getPercCount(int Mes, int Servico) {

		CronogramaRN cronogramaRN = new CronogramaRN();
		Cronograma cronograma = cronogramaRN.buscarPorMes(Mes, Servico);

		return cronograma.getPercMes();
	}

	public List<Cronograma> getLista() {
		CronogramaRN cronogramaRN = new CronogramaRN();

		if (lista == null) {
			lista = cronogramaRN.listar();
		}
		return lista;
	}


	public Obra getObraSelecionada() {
		return obraSelecionada;
	}

	public void setObraSelecionada(Obra obraSelecionada) {
		this.obraSelecionada = obraSelecionada;
	}

	public List<SelectItem> getObrasSelect() {
		if (this.obrasSelect == null) {
			obrasSelect = new ArrayList<SelectItem>();
			ObraRN obraRN = new ObraRN();
			List<Obra> listaObra = obraRN.listarAtivos(true);
			if (listaObra != null && !listaObra.isEmpty()) {
				SelectItem item;
				for (Obra obraLista : listaObra) {
					item = new SelectItem(obraLista, obraLista.getNome());
					obrasSelect.add(item);
				}
			}
		}
		return obrasSelect;
	}

	public void setObrasSelect(List<SelectItem> obrasSelect) {
		this.obrasSelect = obrasSelect;
	}

	public Servico getServicoSelecionado() {
		return servicoSelecionado;
	}

	public Servico setServicoSelecionado(Servico servicoSelecionado) {
		return this.servicoSelecionado = servicoSelecionado;
	}

	public Cronograma getCronogramaSelecionado() {
		return cronogramaSelecionado;
	}

	public void setCronogramaSelecionado(Cronograma cronogramaSelecionado) {
		this.cronogramaSelecionado = cronogramaSelecionado;
	}

	public List<Periodo> getListaPeriodo() {
		PeriodoRN periodoRN = new PeriodoRN();

		if (listaPeriodo == null) {
			listaPeriodo = periodoRN.listar();
		}
		return listaPeriodo;
	}

	public void setListaPeriodo(List<Periodo> listaPeriodo) {
		this.listaPeriodo = listaPeriodo;
	}

	public List<Servico> getListaServico() {
		ServicoRN servicoRN = new ServicoRN();

		if (listaServico == null) {
			listaServico = servicoRN.listar();
		}
		return listaServico;
	}

	public void setListaServico(List<Servico> listaServico) {
		this.listaServico = listaServico;
	}

	public List<Cronograma> getListaCronograma() {
		return listaCronograma;
	}

	public void setListaCronograma(List<Cronograma> listaCronograma) {
		this.listaCronograma = listaCronograma;
	}

	private Map<Integer, Cronograma> getValPercentual() {
		Map<Integer, Cronograma> stats = new LinkedHashMap<Integer, Cronograma>();
		for (int i = 0; i < listaPeriodo.size(); i++) {
			stats.put(listaPeriodo.get(i).getId(), lista.get(contador));
			contador += 1;
		}

		return stats;
	}

	public Integer getContador() {
		return contador;
	}

	public void setContador(Integer contador) {
		this.contador = contador;
	}

	public String getStatus() {
		return status;
	}

	public void setStatus(String status) {
		this.status = status;
	}

	public Integer getIdServico() {
		return idServico;
	}

	public void setIdServico(Integer idServico) {
		this.idServico = idServico;
	}

	public void onCellEdit(CellEditEvent event) {
		Object oldValue = event.getOldValue();
		Object newValue = event.getNewValue();
		DataTable objDataTable = (DataTable) event.getSource();
		servicoSelecionado = listaServico.get(objDataTable.getRowIndex());
		salvarServico();
		//salvarCronograma();
		if (newValue != null && !newValue.equals(oldValue)) {
			FacesMessage msg = new FacesMessage("Alteração com sucesso!");
			FacesContext.getCurrentInstance().addMessage(null, msg);
		}
	}
	public String onCellEditCro(CellEditEvent event) {
		Object oldValue = event.getOldValue();
		Object newValue = event.getNewValue();
		DataTable objDataTable = (DataTable) event.getSource();
		cronogramaSelecionado = listaCro.get(objDataTable.getRowIndex());
		//salvarServico();
		salvarCro();
		if (newValue != null && !newValue.equals(oldValue)) {
			FacesMessage msg = new FacesMessage("Alteração com sucesso!");
			FacesContext.getCurrentInstance().addMessage(null, msg);
			
		}
		return navegacaoBean.redirectToCronograma();
	}

	public void onValidation(CellEditEvent event) {
		FacesMessage msg = new FacesMessage("Alteração com sucesso!");
		FacesContext.getCurrentInstance().addMessage(null, msg);

	}

	public List<Cronograma> getListaCro() {
		return listaCro;
	}


}
